// 特征(Traits)
特征类是一种提供类型相关信息的模板类, 它可以: 
1.提取类型信息: 从某个类型中提取其属性或关联类型
2.固定特征(Fixed Traits): 为模板参数提供必要的相关类型信息
3.值特征(Value Traits): 提供类型相关的常量值
4.参数化特征(Parameterized Traits): 允许用户定制特征行为

// 特征类的主要用途
为不同类型(包括内置类型)提供统一的接口
让泛型代码能够根据类型的特性做出不同决策
避免为不同类型编写大量特化版本的代码

// 特征类示例
// 累加器特征类, 定义不同类型的累加结果类型
template<typename T>
class AccumulationTraits;

template<>
class AccumulationTraits<char>
{
public:
    using AccT = int;  // 为char类型定义累加结果类型为int
    static AccT zero() { return 0; }  // 初始值
};

template<>
class AccumulationTraits<int>
{
public:
    using AccT = long;  // 为int类型定义累加结果类型为long
    static AccT zero() { return 0; }
};

// ------------------------------------------------
// Policy类
Policy类是一种用来定义特定行为的模板类, 它: 
1.定义行为: 为算法提供可替换的行为实现
2.可组合: 多个Policy可以组合使用
3.静态多态: 在编译时而非运行时确定行为

// Policy类的主要特点
通常作为模板参数传递给其他类
专注于"如何做"而非"做什么"
一般不应有非虚析构函数, 避免通过基类指针删除派生类对象

// Policy类示例
// 累加策略类
class SumPolicy
{
public:
    template<typename T1, typename T2>
    static void accumulate(T1& total, T2 const& value)
    {
        total += value;
    }
};

class MultiPolicy
{
public:
    template<typename T1, typename T2>
    static void accumulate(T1& total, T2 const& value)
    {
        total *= value;
    }
};

// 使用Policy的累加器类
// 如果T是long string等没有定义的特化版本, 编译就会报错
template <typename T,
          typename Policy = SumPolicy,
          typename Traits = AccumulationTraits<T>>
class Accum
{
public:
    using AccT = typename Traits::AccT;
    static AccT accum(T const* beg, T const* end)
    {
        AccT total = Traits::zero();
        while (beg != end)
        {
            Policy::accumulate(total, *beg);
            ++beg;
        }
        return total;
    }
};

// 使用例子
int main()
{
    int nums[] = {1, 2, 3, 4, 5};
    
    // 使用SumPolicy (默认)
    std::cout << "Sum: " << 
        Accum<int>::accum(&nums[0], &nums[5]) << '\n';
    
    // 使用MultiPolicy
    std::cout << "Product: " << 
        Accum<int, MultiPolicy>::accum(&nums[0], &nums[5]) << '\n';
    
    return 0;
}


// 特征与Policy的区别
// 1.关注点不同: 
//      特征关注类型信息(what)
//      Policy关注行为实现(how)

// 2.使用方式: 
//      特征通常有自然的默认值, 较少被改写
//      Policy经常被显式指定, 用于选择不同算法实现

// 3.依赖关系: 
//      特征通常依赖于一个或多个主参数
//      Policy通常与其他模板参数正交(独立)
